package com.today36524.stuAch.util;

import java.util.ArrayList;
import java.util.List;

import com.today36524.stuAch.bean.Classes;
import com.today36524.stuAch.bean.Grade;
import com.today36524.stuAch.bean.School;
import com.today36524.stuAch.bean.Student;

public class ComputeUtil {
    private static final java.text.DecimalFormat FORMAT
    = new java.text.DecimalFormat("#.##");
    /**
     * 每班前五名
     * @param s 学校
     * @param g 年级
     * @param c 班级
     */
    public static void showTop5Student(School s,Grade g,Classes c){
        System.out.println("前五名统计中...");
        List<Student> l = new ArrayList<Student>();
        if(c != null){
            top5Out(l,c);
        }else if(g != null){
            System.out.println("年级"+g.getName()+"的各班成绩如下：");
            for(Classes cc : g.getClasses()){
                System.out.println("班级"+cc.getName());
                top5Out(l,cc);
            }
        }else if(s != null){
            System.out.println("学校"+s.getName()+"的各年级各班成绩如下：");
            for(Grade gg:s.getGrades()){
                System.out.println("年级"+gg.getName());
                for(Classes cc : gg.getClasses()){
                    System.out.println("班级"+cc.getName());
                    top5Out(l,cc);
                }
            }
        }else{
            System.out.println("无效学校/年级/班级！");
        }
    }
    
    /**
     * 各科平均分
     * @param s 学校
     * @param g 年级
     * @param c 班级
     */
//    public static void showAverage(School s,Grade g,Classes c){
//        System.out.println("平均分统计中...");
//        List<Student> l = new ArrayList<Student>();
//        if(c != null){
//            l.addAll(c.getStudents());
//        }else if(g != null){
//            System.out.println("年级"+g.getName()+"的各班成绩如下：");
//            for(Classes cc : g.getClasses()){
//                System.out.println("班级"+cc.getName());
//                
//            }
//        }else if(s != null){
//            System.out.println("学校"+s.getName()+"的各年级各班成绩如下：");
//            for(Grade gg:s.getGrades()){
//                System.out.println("年级"+gg.getName());
//                for(Classes cc : gg.getClasses()){
//                    System.out.println("班级"+cc.getName());
//                    
//                }
//            }
//        }else{
//            System.out.println("无效学校/年级/班级！");
//        }
//    }
    
    /**
     * 各等级人数比
     * @param s
     * @param g
     * @param c
     */
    public static void showGroups(School s,Grade g,Classes c){
        System.out.println("优良率统计中...");
        if(c != null){
            levelGroup(c);
        }else if(g != null){
            System.out.println("年级"+g.getName()+"的各班成绩如下：");
            for(Classes cc : g.getClasses()){
                System.out.println("班级"+cc.getName());
                levelGroup(cc);
            }
        }else if(s != null){
            System.out.println("学校"+s.getName()+"的各年级各班成绩如下：");
            for(Grade gg:s.getGrades()){
                System.out.println("年级"+gg.getName());
                for(Classes cc : gg.getClasses()){
                    System.out.println("班级"+cc.getName());
                    levelGroup(cc);
                }
            }
        }else{
            System.out.println("无效学校/年级/班级！");
        }
        
    }
    
    /**
     * 计算年级总分前20和男女状元
     * @param s
     * @param g
     */
    public static void computeTop20AndChampions(School s,Grade g){
        System.out.println("前20及男女第一名统计中...");
        if(g != null){
            gradeTop20AndChampions(g);
        }else if(s != null){
            System.out.println("学校"+s.getName()+"的各年级成绩前20和各科男女第一统计如下：");
            for(Grade gg:s.getGrades()){
                System.out.println("年级"+gg.getName());
                gradeTop20AndChampions(gg);
            }
        }else{
            System.out.println("无效学校/年级！");
        }
        
    }
    
    
    /**
     * 实际计算前五名的方法
     * @param l 学生总集合
     * @param c 当前班级
     */
    private static void top5Out(List<Student> l,Classes c){
        l.addAll(c.getStudents());
        l.sort(new YuwenComparator());
        int i=1;
        for(Student st:l){
            if(i>5) break;
            System.out.println("语文第"+i+"名是"+st.getName()+",成绩是"+st.getYuwen()
                    +",三科平均分是"
                    +FORMAT.format((st.getYuwen()+st.getShuxue()+st.getYingyu())/3.0));
            i++;
        }
        l.sort(new ShuxueComparator());
        i=1;
        for(Student st:l){
            if(i>5) break;
            System.out.println("数学第"+i+"名是"+st.getName()+",成绩是"+st.getShuxue()
                    +",三科平均分是"
                    +FORMAT.format((st.getYuwen()+st.getShuxue()+st.getYingyu())/3.0));
            i++;
        }
        l.sort(new YingyuComparator());
        i=1;
        for(Student st:l){
            if(i>5) break;
            System.out.println("英语第"+i+"名是"+st.getName()+",成绩是"+st.getYingyu()
                    +",三科平均分是"
                    +FORMAT.format((st.getYuwen()+st.getShuxue()+st.getYingyu())/3.0));
            i++;
        }
        l.sort(new TotalComparator());
        i=1;
        for(Student st:l){
            if(i>5) break;
            System.out.println("总分第"+i+"名是"+st.getName()
                    +",成绩是"+(st.getYingyu()+st.getYuwen()+st.getShuxue())
                    +",三科平均分是"
                    +FORMAT.format((st.getYuwen()+st.getShuxue()+st.getYingyu())/3.0));
            i++;
        }
    }
    
    /**
     * 成绩优良等级
     * @param c 班级
     */
    private static void levelGroup(Classes c){
        int youyw=0,yousx=0,youyy=0,liangyw=0,liangsx=0,liangyy=0;
        int jgyw=0,jgsx=0,jgyy=0,bjgyw=0,bjgsx=0,bjgyy=0;
        for(Student st:c.getStudents()){
            if(st.getYuwen()<=100 && st.getYuwen()>=90){
                youyw++;
            }else if(st.getYuwen()<90 && st.getYuwen()>=75){
                liangyw++;
            }else if(st.getYuwen()<75 && st.getYuwen()>=60){
                jgyw++;
            }else if(st.getYuwen()<60 && st.getYuwen()>=0){
                bjgyw++;
            }else{
                System.out.println("学生"+st.getName()
                        +"的语文成绩异常，分数为"+st.getYuwen());
            }
            if(st.getShuxue()<=100 && st.getShuxue()>=90){
                yousx++;
            }else if(st.getShuxue()<90 && st.getShuxue()>=75){
                liangsx++;
            }else if(st.getShuxue()<75 && st.getShuxue()>=60){
                jgsx++;
            }else if(st.getShuxue()<60 && st.getShuxue()>=0){
                bjgsx++;
            }else{
                System.out.println("学生"+st.getName()
                        +"的数学成绩异常，分数为"+st.getShuxue());
            }
            if(st.getYingyu()<=100 && st.getYingyu()>=90){
                youyy++;
            }else if(st.getYingyu()<90 && st.getYingyu()>=75){
                liangyy++;
            }else if(st.getYingyu()<75 && st.getYingyu()>=60){
                jgyy++;
            }else if(st.getYingyu()<60 && st.getYingyu()>=0){
                bjgyy++;
            }else{
                System.out.println("学生"+st.getName()
                        +"的英语成绩异常，分数为"+st.getYingyu());
            }
        }
        System.out.println("班级 "+c.getName()+" 共"+c.getStudents().size()
                +"人，其中\n语文：\n    优"+youyw+"人，占比"
                +FORMAT.format((youyw*1.0/c.getStudents().size())*100)+"%"
                +"\n    良"+liangyw+"人，占比"
                +FORMAT.format((liangyw*1.0/c.getStudents().size())*100)+"%"
                +"\n    及格"+jgyw+"人，占比"
                +FORMAT.format((jgyw*1.0/c.getStudents().size())*100)+"%"
                +"\n    不及格"+bjgyw+"人，占比"
                +FORMAT.format((bjgyw*1.0/c.getStudents().size())*100)+"%"
                +"\n数学：\n    优"+yousx+"人，占比"
                +FORMAT.format((yousx*1.0/c.getStudents().size())*100)+"%"
                +"\n    良"+liangsx+"人，占比"
                +FORMAT.format((liangsx*1.0/c.getStudents().size())*100)+"%"
                +"\n    及格"+jgsx+"人，占比"
                +FORMAT.format((jgsx*1.0/c.getStudents().size())*100)+"%"
                +"\n    不及格"+bjgsx+"人，占比"
                +FORMAT.format((bjgsx*1.0/c.getStudents().size())*100)+"%"
                +"\n英语：\n    优"+youyy+"人，占比"
                +FORMAT.format((youyy*1.0/c.getStudents().size())*100)+"%"
                +"\n    良"+liangyy+"人，占比"
                +FORMAT.format((liangyy*1.0/c.getStudents().size())*100)+"%"
                +"\n    及格"+jgyy+"人，占比"
                +FORMAT.format((jgyy*1.0/c.getStudents().size())*100)+"%"
                +"\n    不及格"+bjgyy+"人，占比"
                +FORMAT.format((bjgyy*1.0/c.getStudents().size())*100)+"%"
                );
    }
    
    private static void gradeTop20AndChampions(Grade g){
        List<Student> l = new ArrayList<Student>();
        for(Classes c:g.getClasses()){
            l.addAll(c.getStudents());
        }
        l.sort(new TotalComparator());
        int i=1;
        for(Student st:l){
            if(i>20) break;
            System.out.println("本年级总分第"+i+"名是"+st.getName()
                    +",成绩是"+(st.getYingyu()+st.getYuwen()+st.getShuxue())
                    +",三科平均分是"
                    +FORMAT.format(
                            (st.getYuwen()+st.getShuxue()+st.getYingyu())/3.0));
            i++;
        }
        Student maleChmp = null;
        Student femaleChmp = null;
        l.sort(new YuwenComparator());
        for(Student st:l){
            if(maleChmp!=null && femaleChmp!=null) break;
            if(st.getSex()==1 && maleChmp==null) maleChmp = st;
            else if(st.getSex()==2 && femaleChmp==null) femaleChmp = st;
        }
        System.out.println("本年级语文成绩，男生第一名是"+maleChmp.getName()
                +",成绩是"+maleChmp.getYuwen()
                +"分,女生第一名是"+femaleChmp.getName()
                +",成绩是"+femaleChmp.getYuwen()+"分");
        maleChmp = null;
        femaleChmp = null;
        l.sort(new ShuxueComparator());
        for(Student st:l){
            if(maleChmp!=null && femaleChmp!=null) break;
            if(st.getSex()==1 && maleChmp==null) maleChmp = st;
            else if(st.getSex()==2 && femaleChmp==null) femaleChmp = st;
        }
        System.out.println("本年级数学成绩，男生第一名是"+maleChmp.getName()
                +",成绩是"+maleChmp.getShuxue()
                +"分,女生第一名是"+femaleChmp.getName()
                +",成绩是"+femaleChmp.getShuxue()+"分");
        maleChmp = null;
        femaleChmp = null;
        l.sort(new YingyuComparator());
        for(Student st:l){
            if(maleChmp!=null && femaleChmp!=null) break;
            if(st.getSex()==1 && maleChmp==null) maleChmp = st;
            else if(st.getSex()==2 && femaleChmp==null) femaleChmp = st;
        }
        System.out.println("本年级英语成绩，男生第一名是"+maleChmp.getName()
                +",成绩是"+maleChmp.getYingyu()
                +"分,女生第一名是"+femaleChmp.getName()
                +",成绩是"+femaleChmp.getYingyu()+"分");
    }
}
